﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ch06
{
    //定义学生类

    //类上只能添加两种访问修饰符：internal、public
    //internal：内部的，本项目可用
    //public：公共的，所有项目都可以用
    //类上不写访问修饰符，默认internal内部的
    public class Student
    {
        //定义属性
        public string name;    //姓名
        public int age;        //年龄
        public char sex;       //性别

        //private int id;
        protected int id;

        //定义构造方法
        //1、构造方法没有方法类型，void都不能有
        //2、构造方法的名字必须与类名相同
        //3、new实例化对象时，系统会自动调用构造方法，来创建对象
        //4、使用构造方法主要的目的是方便初始化对象的数据
        //5、构造方法可以有一个，也可以有多个(重载)
        //6、不显示的定义构造方法，不代表就没有构造方法，系统会自动默认添加一个不代参的构造方法
        //7、一旦你定义了构造方法，系统则不再自动默认添加不代参的构造方法

        //无参的构造方法
        public Student()
        {
            Console.WriteLine("开始构造一个学生对象...");
        }
        //带一个参的构造方法
        public Student(string name)
        {
            Console.WriteLine("开始构造一个学生对象...");
        }
        //带多个参的构造方法
        public Student(string name, int age, char sex)
        {
            this.name = name;
            this.age = age;
            this.sex = sex;

            Console.WriteLine("开始构造一个学生对象...");
        }

        //定义方法
        /*
        //无参无返回值的方法
        //方法的数据类型就是返回值的类型
        //没有返回值就是返回空值，所以是空类型，关键字是void
        数据类型 方法名()
        {
            //方法体，方法要实现的功能的代码
        }
        */
        //定义一个学习的方法
        public void study()
        {
            Console.WriteLine(name + "开始学习...");
        }

        //定义一个自我介绍的方法
        public void intro()
        {
            Console.WriteLine("我是{0},今年{1},性别{2}", name, age, sex);
        }

        //有参无返回值的方法
        public void drink(string water)
        {
            Console.WriteLine(name + "开始喝"+water+"...");
        }

        //有参且有返回值的方法
        //方法的类型long要与返回值result的类型一致
        public long pow(int n1,int n2)
        {
            long result = 1;
            for (int i = 0; i < n2; i++)
            {
                result *= n1;
            }
            return result;
        }

        public void test()
        {
            //return语句后面不写返回值，则起到立刻结束方法的作用

            //根据条件判断是否立刻退出方法，不执行后面的语句
            /*
            if (条件)
            {
                return;     //立刻结束方法
            }
            Console.WriteLine("over");
            */
        }

        //重写从object父类继承而来的ToString方法
        public override string ToString()
        {
            return "大家好，我是" + name;
        }

        /*
        方法的重载：
        1、同一个类中，方法名一样
        2、参数不一样(类型、个数、顺序不一样都认为是参数不一样)
        3、是否重载跟访问修饰符，方法类型，静态关键字无关
        */
        //定义打印的方法
        public void print(string msg)
        {
            Console.WriteLine(msg);
        }

        //下面两个print方法都不算重载，会报错
        /*
        private void print(string msg)
        {
            Console.WriteLine(msg);
        }
        public int print(string msg)
        {
            Console.WriteLine(msg);
            return 100;
        }
        */

        //重载打印的方法(参数类型不一样)
        public void print(int num)
        {
            Console.WriteLine(num);
        }
        //重载打印的方法(参数个数不一样)
        public void print(string msg,int num)
        {
            Console.WriteLine(msg);
        }
        //重载打印的方法(参数顺序不一样)
        public void print(int num,string msg)
        {
            Console.WriteLine(msg);
        }
        
    }
}
